package model.service;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import exceptions.AtributoException;
import exceptions.UsuarioNaoEncontradoException;
import model.entity.Usuario;
import model.repository.UsuarioRepository;
import model.util.CriptoUtils;

@Service(value="usuarioService")
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public class UsuarioServiceImpl implements UsuarioService{

	private UsuarioRepository usuarioRepository;

	@Autowired
	public void setUsuarioRepository(UsuarioRepository usuarioRepository){
		this.usuarioRepository = usuarioRepository;
	}
	
	public Usuario findByEmail(String email){
		
			return this.usuarioRepository.findByEmail(email);
		
	}

	
	public Usuario findById(int id) {
		
			return this.usuarioRepository.findById(id);
		
		
	}

	
	public Usuario findByMatricula(String matricula) {
		
			return this.usuarioRepository.findByMatricula(matricula);
		
	}

	
	public List<Usuario> getList() {
		
			return this.usuarioRepository.getList();
		
	}

	
	public void remove(Usuario usuario) throws UsuarioNaoEncontradoException {
		
			this.usuarioRepository.remove(usuario);
		
	}

	
	public void save(Usuario usuario) throws AtributoException {
		
			this.usuarioRepository.save(usuario);
		
		
	}
	public void update(Usuario usuario){
		this.usuarioRepository.update(usuario);
	}
	
	public String descriptSenha(String senha) {
		try {
			return CriptoUtils.pwDecrypt(senha);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	
	public String emcriptSenha(String senha) {
		try {
			return CriptoUtils.pwEncrypt(senha);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (BadPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchPaddingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvalidAlgorithmParameterException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public Usuario verificaLogin(String matricula, String senha){
		
		return this.usuarioRepository.verificaLogin(matricula, senha);
		
	}
}
